package com.ggkt.redis;

import org.apache.commons.lang.StringUtils;

/**
 * 缓存空对象伪代码
 * 这是一个通过设置空对象解决缓存穿透的伪代码
 * 具体场景：一个系统来了大量的请求（可能是黑客或扫描软件），在缓存层查不到对应数据
 * 导致请求链路到了后端数据库层，造成数据库层访问压力出现，而产生的一种击穿现象；
 * 我们通过在缓存层设置对应key值的空对象，是的请求不会请求到数据库层；而这样缓存会有一个
 * 问题，不如10001数据库不存在，而缓存层设置了空值，当数据库层增加了这条记录后，给用户
 * 返回的数据就不是系统真实存放的数据了，所以说在设置空对象时还需要设置相应的过期时间。
 * 这样一定程度解决了缓存击穿的问题，同时有保证了数据库层数据做了修改后，空对象能够合理更新
 * 弊端：空对象特别多时，需要占用大量的内存空间。
 */
public class CacheNullObject {
    /*String get(String key) {
        // 从缓存中获取数据
        String cacheValue = cache.get(key);
        // 缓存为空
        if (StringUtils.isBlank(cacheValue)) {
            // 从存储中获取
            String storageValue = storage.get(key);
            cache.set(key, storageValue);
            // 如果存储数据为空， 需要设置一个过期时间(300秒)
            if (storageValue == null) {
                cache.expire(key, 60 * 5);
            }
            return storageValue;
        } else {
            // 缓存非空
            return cacheValue;
        }
    }*/
}
